プログラミングやRPG(作るほう)が好きな人の日記
このホームページは毎日 夜11時にアクセスできなくなります。 朝6時半に再開されます。(世の中のネット依存対策として) 「homepage6047.sakura.ne.jp」は近々、「 web 6047.sakura.ne.jp」に変更予定です。 |
DRAM の記事 について、すべての図を修正しました。
図が大量だったので疲れました…
それから、最終的な完成写真と、その回路図、動画も作成して掲載してあるので、興味のある方はご覧ください。 ここ
DRAM の記事について、完成写真を新しいものに変更し、動画も付けました。 ここ
DRAM 回路を自分でも作ってみようと取り組んでいる方のための取り急ぎの連絡事項、 ここ
DRAM が思った通りに動かず、3日間くらいずっと試行錯誤していたので、説明のほうは進んでいません。
試行錯誤は幸運にも解決し、ちゃんと最終的な完成に至ったと思います。
10月のページを作らないとな…
9/26(木)から10/3(木)まで、NO PC WEEK とします。
10/10(木)まで延長することも考えています。
そのあいだホームページの更新はなく、フォームなどの返信等もできません。
今月は久しぶりにスクリプトをページの最初に飾っています。
「よくある 2D の星の接近アニメーション」と思わせておいて、「実は 3D で回転するぞ」というサプライズ(驚き)を意図して作りました。
「イース1」というゲームソフトでエンディングをむかえてスタッフロールが流れるとき、その背景で星が画面中央から拡散するようにアニメーションします。それと似たような画面を今回最初に表示しています。
スクリプトで下図のようなことをやっています。
途中のメッセージで「回転、回転」と言っているのは、図中のカメラの回転のことです。
星は常に、同じ方向へ流れているか止まっているかのどちらかの動きしかしていません。
スクリプトのソースコード (コントでプログラムの案内をしています)
2019/8/7に、
みなさんも、お盆休みに暇ならば、前から取り組もうと思っていたものを根詰めて勉強してみるとか、絵の苦手なところの練習とかでもいいと思うんですが、何かしらやってみてはどうでしょう。
と私が言っていたので、私自身のお盆休み中の勉強の結果をお知らせしておきます。
お盆休みの初日から6日かけて読みました。以前にも読んだことがあり、今回は2~3回目です。
データベースを操作するための SQL という言語の勉強です。
JavaScript とかだったら日常的に使うので身につきますが、SQL は使わないので 2~3回読んでも身につきません。
ちょっとは身についているんだろうか…
お盆休みの後半 3, 4日かけて読みました。これも以前読んだことがあり、今回で 3回目くらいかな?
私は今44才ですが、私も若いころはこんなふうに「あの本何度読んだ」とか そんなことはしていませんでした
大人になると執念深くなるんでしょうか。
でも、アセンブラも使わないので、身についている感じがしません。
応用情報の資格試験受験の申込みをしてありますが、ちゃんと勉強するのかな…。
お盆休みはちゃんと貫いて勉強できましたが、応用情報の勉強はちょっと失速気味だな。
(この記事は書き途中です。2019/10/6現在毎週加筆していますが、なかなか完成しない…)
メモリーのしくみなどハードウェアを理解すると、プログラミングで応用が利くようになりま。
ブラックボックスだったパソコンの正体が見えてくると、興味がわいてくると思います。
また、見えなかったものが見えると、自由に使いこなせる気がするものです。
ただし、基礎や本質といった部分は勉強に時間がかかり、なかなか勉強する時間は取りづらいので、そのつもりで臨みましょう。
今年のゴールデンウィークのときに、パソコンのメモリーのしくみについて このホームページ上で説明しまし。
パソコンの中にはメモリー基板が入っていて、その基板にはメモリー IC がいくつか載っていて、そのメモリー IC の中はメモリセルと呼ばれる小さな回路がメモリーの容量の分 敷き詰められていて、そのメモリセル 1 つが 1 ビットの情報を保持している。そしてそのメモリセルは基本的にコンデンサであって、コンデンサに電気が溜まっていれば「1」を表し、電気が溜まっていなければ「0」を表す…という説明でした。
その説明の最後のほうで…
このように、4か月前、説明の足らない部分について修正の予告をしていました。
どの点が説明が足らないのかと言うと、プログラムでたとえば整数の 123 を使ったとき、123 はコンピューターの 2進数で表すと、0111 1011 となり、そのビットの並びが、そのままメモリー IC の中で、電気を蓄えたコンデンサと電気を蓄えていないコンデンサの並びに対応していると きっぱり言ってしまっているところです。この説明だけだと、本当にそうなっているのか、いまいち信じられない状態です。
そういうことなので、今回は DRAM メモリー と同じ回路を作って、マイコンからメモリーを書き込んだり読み込んだりして実験してみることにします。
実際に動いているところを見れば、説明も「そうなんだ」と理解できるのではと思います。
それでは始めましょう。結構長い説明です。
DRAMメモリーは、電気の基本的な回路と、ちょっとの新しい知識があれば、理解できると思います。
まずは電気の基本的な回路を確認しましょう。
以降の説明は、あくまでも、DRAM のしくみを理解するための説明です。
説明の中で電気回路のしくみについて詳しく説明していますが、「電気回路の 製作 を教えている読み物」ではありません。
もし、説明に合わせて自分でも回路を組んでみよう(電子工作をしよう)という方は、電気を扱う際は危険なこともあるので注意してください。
できればちゃんとした電子工作入門の本を購入していただいて、注意点を読む等、きちんとした手順を踏んで電子工作を始めてください。
簡単に言えば、電池のプラスとマイナスが直に接触(ショート)しないようにし、また、途中の回路でも同じく「ショート」が起こらないようにしてください。
そして、部品にはそれぞれ「定格」というものがあり、電子工作を楽しむためにはとても重要なことなので、よく調べてください。定格とは、たとえば、豆電球に電池をたくさんつないでしまうと焼き切れてしまうといった限度のことです。限度を超えると、部品がするどい音を出して破裂したり、煙が出たりします。非常に危険です。
豆電球と乾電池の回路です。
▼豆電球に 単三型 乾電池 をつなげると、点灯します。 |
▼その回路図 |
※豆電球の回路記号は正式には、 です。
そこにスイッチを付けるとこうなります。
▼スイッチを付けました。 ※画像をクリックすると、豆電球が点灯します。 |
▼その回路図 |
ここまでは、簡単なんじゃないかと思います。
次は、豆電球を LED に変更してみましょう。
▼豆電球を LED に変更し、電池を直列に増やし 3V にする。
|
▼その回路図 ※1.5V を横に二つ並べると合わせて 3V になます。
|
|
回路図で LED の記号が出てくると、どこか難しそうに見えますが、豆電球と同じと言えば同じです。
ただ、豆電球は+-どちらをつないでも点灯するけど、LED は LED から出ている線の長いほうを+、短いほうを-につなぎます。
乾電池をボタン電池に変更します。
▼単三型 乾電池をボタン電池に変更します。
|
▼その回路図 ※このボタン電池は 3V です
|
|
そこへスイッチを付けましょう。
▼スイッチを付けました。 ※画像をクリックすると、LED が点灯します |
▼その回路図 |
|
以上は小学校~中学校あたりの理科の授業でやったものだと思います。
LED も最近は小学校で習うようです。
トランジスタはスイッチ として使えます。
トランジスタは、黒いボディに3本の線が出ている、という形をしています。
▼トランジスタ |
▼実際の写真 |
トランジスタには種類があり、ここで使用しているのは型式「C1815 GR」です。
型式から、種類は「NPN型」で性能は「"GR"」であることがわかります。
異なる種類・性能のトランジスタを使うと、ここで実験している内容は再現されません。
電気部品の通販で "C1815 GR" を検索する( 秋月電子通商で検索 )と、複雑な型式が並びますが、"C1815" と "GR" という文字を含む型式であれば大丈夫です。
3本の線のうち2本は、普通のスイッチと同じようにオン・オフしたい回路をつなげます。
▼普通のスイッチの場合 |
▼トランジスタの場合 2つの線は図の通りにつなげます。逆になげないようにしてください
|
3本の線のうち残りの1本は、普通のスイッチで人間が指でスイッチをオンするのと同じように、この線に電気を流すことでスイッチをオンします。
▼普通のスイッチの場合 |
▼トランジスタの場合 |
この線に電気を流すには、電池の + から線を引っ張ってきてつなげます。
しかし、そのままだと電流が大きすぎるので、抵抗を入れて電流を下げます。
▼プラスから線を引っ張ってきてつなげますが… |
▼抵抗を入れて電流を下げます |
抵抗値 10k は、回路の内容が異なると、異なる値になります。
以上を経て、「トランジスタをスイッチとして使う回路」が出来上がりました。
▼トランジスタとスイッチは同じことをします。
点灯/消灯 スイッチ版/トランジスタ版 |
▼その回路図 |
|
トランジスタは電気の勉強としては難しいものですが、上図のように使い方を限ってしまえば、普通のスイッチと同じ感覚で使えます。
でも、結局 手動で接続 しているなら、わざわざトランジスタ を使わず、普通の手動のスイッチ のままでいいんじゃないか…と思うかもしれません。しかし、この手動でつなげている線をマイコン へつなげれば、プログラムで「3分ごとに1回押す」というようなことができるようになるんです。それがトランジスタ(半導体)の良いところなんですね。
ここまで記事を書いて思ったんですが、話は長くなりそうです…。
一般の人にわからないことは書かない、わかることだけを書く…そんなつもりで書いているので、量も時間も多くなるんですね…。
ところで、コンデンサって、なじみがありませんよね。
豆電球や単三型 乾電池は使い方はよくわかるけど、コンデンサって使い方が不明です。
▼コンデンサに充電
|
▼コンデンサから放電 ※点灯時間 0.6 秒 くらい |
|
小さなコンデンサなら大丈夫ですが、大きな大容量のコンデンサで同じことをやると、火傷(やけど)しますので絶対にやらないでください。
コンデンサに 0.6 秒分の電気をためて豆電球を一瞬チカッと光らせたとしても、それは日常では何の役にも立ちそうにありません。
だからコンデンサって一般的な部品にはならない(なじみがない)んでしょうね…。
さきほどの「トランジスタをスイッチとして使う回路」の LED をコンデンサに取り換えてみましょう。
▼LED とコンデンサをとりかえ。
ON/OFF コンデンサ版/LED版 |
▼その回路図 |
コンデンサを充電したまま放置するとどうなるのか私知らないので、放置しないようにしてください。
部品が LED からコンデンサに変わって、回路の機能が「LED点灯」から「コンデンサ充電」へ変わりました。
コンデンサの形がちがっても、同じことができます。
▼コンデンサに充電
|
▼コンデンサから放電 ※点灯時間 0.03 秒 くらい |
|
▼コンデンサへ充電 (トランジスタ使用)
ON/OFF |
▼その回路図 |
この青いタイプのコンデンサ を使って DRAM 回路を作っていきます。
マイコンについて簡単に見ていきましょう。(この項目は 2020/1/31 現在作成中です)
豆電球も LED も電池を接続することで点灯します。 |
マイコンも同様に、こんなふうに電池を接続することで動作します。 |
マイコンにプログラムを書き込むにはパソコンが必要です。 しかしマイコンとパソコンを接続するにはどうしたらいいのでしょうか… |
どんな種類のマイコンにしろ、たいていはこういうものが必要です。 「マイコン内蔵のプログラムメモリに、書き込みを行うためのライタ」です。 図は PIC というマイコンのライタで、だいたい 5,000円 程度です。 |
ライタをどのように接続するのかというと… |
こんなふうに接続します。なかなか大変そうですね。 |
また、たいていのマイコンは、「書き込むプログラムを、プログラミングするための専用のソフトウェア」(開発環境)が必要で、そのマイコンのメーカーから無料で提供されています。 例で示した PIC というマイコンに対応する開発環境は、MPLAB-IDE です。「エムピーラブ、アイ・ディー・イー」と読みます。 |
このボタン電池をマイコン に変更すると、いよいよ DRAM メモリーっぽくなってきます。
▼ボタン電池とマイコンをとりかえ
マイコン版/ボタン電池版 ボタンを押すと、マイコンと電池とで配線対応していることがわかります。
|
▼せっかくピンがたくさんあるので赤と緑の配線を分離しましう。
|
ところで、マイコンにはピンがたくさんありますが、それぞれ「出力」と「入力」のどちらかを選ぶことができ、さらに出力は「3V」か「0V」かどちらかを選ぶことができます。 ※ドラクエみたいなのは冗談です
|
▼マイコンの中で 3V と 0V を切り替えれば、人間の手による手動ではなく、プログラムによる自動でトランジスタをオン・オフできます。
3V と 0V を切り替え |
DRAMメモリーですから、コンデンサに対してやりたいことは以下のとおりです。
コンピューターのメモリーは、1010 といった情報、つまり 1 や 0 を書き込むし、またそれを読み出しもしますね。
コンデンサに電気をためる。(情報1を書き込む)
▼コンデンサに電気をためる ※画像切り替えのボタンは右にあります。
|
コンデンサに電気をためる手順:
これがつまり、「メモリーに情報1を書き込んだ」ということです。 このあと、コンデンサは電気を保持(メモリー)し続けます。
|
コンデンサにたまった電気を消去する。(情報0を書き込む)
▼コンデンサにたまった電気を消去する ※画像切り替えのボタンは右にあります。 |
コンデンサにたまった電気を消去する手順:
これがつまり、「メモリーに情報0を書き込んだ」ということです。 私も電気の知識は高くないので確かなことは言えませんが、電気をたくわえたコンデンサを図のように「出力0V」のピンと「- (GND)」のピンにつなげるというのは、ショート させているんじゃないかなぁ…?という気がします。微弱な電気なので影響は少ないと思いますが、本当ならコンデンサとピンBのあいだに抵抗を入れるべきかもしれません。 |
コンデンサに電気がたまっているかどうかを調べる。(情報を読む)
▼コンデンサに電気がたまっているかどうかを調べる ※画像切り替えのボタンは右にあります。 |
コンデンサに電気がたまっているかどうかを調べる手順:
これがつまり、「メモリーから情報を読んだ」ということです。繰り返し読んでもコンデンサの電気はすぐになくなりません。しかしこの 0.1u という容量のコンデンサは実際に測ったら3,4分くらい経過すると電気が消滅するようです。 |
以上は1つのコンデンサについてメモリとして読み書きしているので、「1ビットメモリー」と言えるでしょう。
この「1ビットメモリー」は、Wikipedia の DRAM のページで説明されている「メモリセル」にあたるものです。
Wikipedia - DRAM(Dynamic Random Access Memory)- 3.2 メモリセル構造
ここまで読んで、DRAM のしくみをある程度理解していただいた方には、この Wikipedia のページは以下の言葉の読み替えだけ行えば、だいたい理解して読めると思います。
ここで電子回路を自分で組める人のなかには「1ビットメモリー回路」を試してみようと思う人もいるかもしれません。
しかし、一筋縄ではいかないところがあります。
ちょっと大げさに書くと、コンデンサの容量、マイコンの動作速度、プログラムによる制御のタイミングなどがからんで、上記で説明した単純な手順で実践しても、動かない確率が高いです。
「なんだ動かないじゃん」とがっかりさせちゃうのも申し訳ないので、ちょっと策を考えておきます…。
策ができあがるまで、実際に動いている回路の資料を掲載しておきますので、必要な方はご覧ください。
PIC24H の場合:
1ビットメモリーを横に並べる。
中学校の理科でやったことで、もう1つ確認しておいたほうが良いことがあります。
▼豆電球を3つ、乾電池につなげる
どれも同じ明るさで光る。 |
▼その回路図 並列回路では、各豆電球の電圧は電源の電圧と同じ。
|
|
同じ電気信号を、複数の場所で使いまわしたいとき、この並列の枝分かれを使います。
ここから説明も大変になってきますが、覚悟を決めて取り組むことにします。
では、1 ビットメモリーを横に並べて 2 ビットメモリーへと変更していきましょう。
以上で 2 ビットメモリーになりました。
では、メモリーとしての書き込み、読み込みを見てみましょう。
ここで電子回路を自分で組める人のなかには「1ビットメモリー回路」につづいて、「2ビットメモリー回路」も試してみようと思う人もいるかもしれません。
しかし、「1ビットメモリー回路」同様、「2ビットメモリー回路」も一筋縄ではいかないところがあります。
実際に動いている回路の資料を掲載しておきますので、必要な方はご覧ください。
IchigoCake の場合:
PIC24H の場合:
IchigoCake から BASIC の「IN( 1 )」という命令や、「OUT 6,1」という命令でちゃんと読み書きできる様子が、どこか素直に感じられました。
(素直と言ったら自分だと言おうとしている)
では、同じ調子で、合計 8 ビットになるようにビットを追加していきましょう!
そして、とうとう「8ビットメモリー」になりました。
数が増えただけで、基本的に動きは変わりません。
図の右下のマイコンの、右端の緑の線がつながったピンを出力3Vに設定すると、8個のトランジスタが一斉にスイッチオンになるところを想像してください。
そして一斉にコンデンサの中身が、「入力」に設定されたマイコンの各ピンへと流れていくことも想像してください。(読み出しの動き)
書き込みの場合は、出力0Vなり、3Vなりに設定された各ピンからコンデンサへ向かって電流が流れていくわけですね。
実際に動いているところを写真に撮ったのでご覧ください。
その1 実際に電子回路を組む方のための資料: ※コンデンサは「積層セラミックコンデンサ 10uF 」です。(IchigoCake で 8 ビットにした場合、0.1uF でも 1uF でも結果が全ビット「1」になってしまい動作しないことを確認しています) ※トランジスタ型式は「C1815 GR」です。 ※IchigoCake のピン出力は 3.3V です。 ※「10k」は「抵抗10kΩ」です。 ※IchigoCake BASIC 1.3.2 を使用。
|
その2 「123」という数値を2進数「0111 1011」に直してメモリーに書き込み、つづいて読み出しを行い、読み出した結果を10進数に直し、LED の点滅の回数で知らせています。 実際に電子回路を組む方のための資料: ※コンデンサは「積層セラミックコンデンサ 10uF」です。(PIC24H では0.1uF でも 1uF でも 10uF でも正常動作を確認できましたが、この例では IchigoCake に合わせて 10uF を使っています) ※トランジスタ型式は「C1815 GR」です。 ※PIC24H のピン出力は 3V です。 ※「10k」は「抵抗10kΩ」です。 ※MPLAB X IDE にて C30 C言語コンパイラを使用(※C30は無償ですがIDEに最初から入っていません) ※実体配線図のとおりにした場合、電源は PICkit3 から供給するように MPLAB-IDE のプロジェクトに設定をします。 MPLAB-IDE にて、File メニュー>Project Properties (そのプロジェクト名)>(表示される画面の)左のリストで PICkit 3 クリック>右の上部のプルダウンメニューで「Power」を選択>Power target circuit from PICkit3 にチェックを入れる。OK ボタンで画面を閉じる。 ※IchigoCake と違って文字表示ができないので、LED の点滅回数で結果を示しています。 ※実体配線図のとおりにした場合、LED のそばに LED を点灯させるだけのボタンがあります。リセットボタンと間違えないように気を付けてください。 ※プログラムの内容は、左の IchigoCake とまったく同一の動きになっていす。 |
1ビットメモリーを縦に並べる。
パソコンのメモリーには「アドレス」というものがあり、アドレス 1 つ 1 つは 8 ビットのデータを持っています。
これまで作成した「8ビットメモリー回路」は、いわばアドレスが1つしかないメモリーです。
そこへ縦にもう 8 ビット並べて、できた 2 行をそれぞれ、アドレス1とアドレス2として、2つのアドレスを選んで 8 ビットを読めるような回路にしていきます。それができれば DRAM 回路は完成です。
しかし、いきなり 8 ビットを 2 行にしても、難しいので、1 ビットを縦に並べることから始めましょう。
1ビットメモリー回路です。これを縦に並べていきましょう。
トランジスタとコンデンサ、10kの抵抗をもう1セット用意します。
マイコンに新しいピンJを用意して、新しい抵抗とつなげます。
この緑の配線が2つになったことが、アドレスが2つになったことに相当します。
2つのコンデンサは、同じ「1ビット目」です。
(あとで横に8ビット並べたとき、この2つは両方とも8ビットのうちの1ビット目に当たる、ということです
それぞれ1ビット目である2つのコンデンサがトランジスタを介して2つともピンBにつながるようにします。
最後に「-」をつなげます。
以上で2アドレスになりました。
複雑に見えますが、把握しましょう。わっか(回路)はまず上に1つと…
下にもわっか(回路)が1つあります。
では、メモリーとしての書き込み、読み込みを見てみましょう。
▼「アドレス1」に2進数「1」を書き込み
|
|
上の図では二つの回路のうち下のほうの回路をグレーアウトさせています。
ここでは上の回路の「アドレス1」にだけアクセスできれば良いので、下の回路の「アドレス2」はスイッチオフの状態にしておきます。
これは、下図のように豆電球を並列に2個つないで、1つの豆電球をソケットから外した状態と同じと考えられます。
ソケットから外した豆電球には電気はまったく通らないので、存在しないことと同じです。
次の図では、今度は上の回路がグレーアウトしています。
▼「アドレス2」に2進数「0」を書き込み
|
|
▼アドレス1を読み込み
|
|
▼アドレス2を読み込み
|
|
このように2つの回路のうち、どちらか一方のトランジスタをオンにすることで、その回路だけを有効にしてメモリーの読み書きを行っているわけです。
それがつまり、メモリーの「アドレスを指定する」という動きです。
C言語などの「ポインタ」に1を足してアドレスを進めていた時、パソコンの中ではこういう動きになっていたんですねぇ。
電子回路のこういうしくみ、面白いですよね
|
(※これはあくまでも基本の動作であって、最近のメモリーはもっと効率化しているようです)
「2アドレス1ビットメモリー」。実際に動いているところを見てみましょう。
その1 実際に電子回路を組む方のための資料: ※コンデンサは「積層セラミックコンデンサ 」です。
※IchigoCake のピン出力は 3.3V です。 ※「10k」は「抵抗10kΩ」です。 ※IchigoCake BASIC 1.3.2 を使用。
|
その2 2進数の「1」をアドレス1に書き込み、 2進数の「0」をアドレス2に書き込んでいます。 その後、アドレス1とアドレス2を読み込んで結果を LED の点滅の回数で知らせています。 LED は「チカーッ チカッ チカーッ … チカーッ」と点滅します。 「チカーッ」は区切りを意味します。区切りのあいだで「チカッ」と点滅すれば1を表し、沈黙すれば0を表します。
実際に電子回路を組む方のための資料: ※コンデンサは「積層セラミックコンデンサ 」です。
(PIC24H は他の回路では 0.1uF でも OK なのに、ここでは正常動作になりません。原因は不明です) ※PIC24H のピン出力は 3V です。 ※「10k」は「抵抗10kΩ」です。 ※MPLAB X IDE にて C30 C言語コンパイラを使用(※C30 は無償ですが IDE に最初から入っていません) ※実体配線図のとおりにした場合、電源は PICkit3 から供給するように MPLAB-IDE のプロジェクトに設定をします。 MPLAB-IDE にて、File メニュー>Project Properties (そのプロジェクト名)>(表示される画面の)左のリストで PICkit 3 クリック>右の上部のプルダウンメニューで「Power」を選択>Power target circuit from PICkit3 にチェックを入れる。OK ボタンで画面を閉じる。 ※IchigoCake と違って文字表示ができないので、LED の点滅回数で結果を示しています。 ※実体配線図のとおりにした場合、LED のそばに LED を点灯させるだけのボタンがあります。リセットボタンと間違えないように気を付けてください。 ※プログラムの内容は、左の IchigoCake とまったく同一の動きになっています。 ただし、若干、異なる部分があります。(読み込みの入力実行の直前で、少し待つ必要がある。おそらく PIC24H の処理が速すぎて、コンデンサが出力を始める前に入力を終えてしまうため) |
以上、「2アドレス1ビットメモリー」でした。
…なんか、プログラミングに強くなるためと言いつつ、バリバリに電子回路の話になっていますが…。
電子回路というよりは、ものごとのカラクリを知ってほしいだけです。
メモリーのしくみを一から知ることが、プログラミングの力になるんです。
「2アドレス1ビットメモリー」を横に並べる。
「2アドレス1ビットメモリー」をさらに横に並べて、「2アドレス2ビットメモリー」にしましょう。
2アドレス1ビットメモリー回路です。これを横にもう1ビット増やす手順を見ていきましょう。
横に 1 ビット増やすことができれば、目的の 8 ビットにすることもできる、ということです。
トランジスタとコンデンサ、10k の抵抗を隣にもう1セット用意します。
抵抗につながる「スイッチ」の配線を、並列になるように一本増やして…
新しい抵抗につなげます。
ちなみに、並列になるので、枝分かれした配線には同じ電圧がかかるようになります。
下の回路も同様に線を増やします。
新しい2つのコンデンサは、上のほうが「アドレス1の2ビット目」、下のほうが「アドレス2の2ビット目」で、両方とも「2ビット目」のコンデンサです。
※1ビット目は赤色、2ビット目はピンク色にして見分けやすく色分けました。
マイコンに新しいピンCを用意して新しいトランジスタへつなげます。
ピンBは1ビット目の読み書きに使い、ピンCは2ビット目の読み書きに使います。
そういう役割になっています。
下の回路のほうも同じ「2ビット目」ということで、ピンCとトランジスタをつなげます。
もしも、アドレスを3アドレス、4アドレス…と、どんどん増やすなら、それらの1ビット目はすべてピンBへ、2ビット目はすべてピンCへとつなげることになります。
最後に「-」をつなげます。
下の回路の「-」もつなげます。
以上で2アドレス2ビットになりました! しかし配線がだいぶ多くなってゴチャゴチャとしています。
整頓しましょう。
下図の左のように同じ端子につながる配線というのは、右のように配線の途中につなげたとしても、変わりのない同じ回路です。
…なので、このように整頓できます。線が少なくなって見通しが良くなりました。
この図はクリックすると、「2アドレス2ビット」と「2アドレス1ビット」を切り替えます。
何度もクリックして、どのように追加されたのか見極めてください。
この調子でこのあと、3ビット目、4ビット目と追加して8ビット目まで作るんですが、どうやって追加していけばいいかはもうわかりますよね。
(※この回路を実際に組んで動かない場合は各コンデンサの容量を 0.1uF ではなく、1uF や 10uF に変更してみてください)
(※遅いマイコンでも速いマイコンでも動作する 10uF が一番良いと思います。10uF は持っていない人が多いと思うので回路を試すなら買うことになると思いますが、積層セラミックコンデンサを電気部品通販で検索すると、絶縁型とそうでないものが出てきます。絶縁型は外装に電気線が触れたとき、端子と電気的に接続されないことが保証されているというものです(そのことを確認するには、 JIS検索 を開き、規格番号「C5602」を一覧表示(1件)してリンク先から PDF を開き、その 22 ページ、一番下の番号 3311 を見てください。「印加できる」という表現は「印加しても問題が起きない」と読み替えます)。大きな電圧を使わない趣味の範囲ならば絶縁型でもそうでないものでも好みで選べばいいと思います)
※このホームページは、誰かに見てもらって「ここがわからない」とか「もっとこうしたほうがいい」などの意見を聞いて修正する、という工程を踏んでいないので、もしかしたら「わからない…」ということになってしまっているかもしれません。しかし、2,3ヶ月後に私自身があらためて読んで修正するということは頻繁に行っています。
では、「2アドレス2ビットDRAMメモリー回路」の、メモリーとしての書き込み、読み込みを見てみましょう。
▼「アドレス1」に2進数「10」を書き込み
|
|
▼「アドレス2」に2進数「01」を書き込み
|
|
▼アドレス1を読み込み
|
|
▼アドレス2を読み込み
|
|
「2アドレス2ビットDRAMメモリー回路」のメモリーの読み書きの動きを見てきました。
では次に実際に動いているところ(実験)を見てみましょう。
はっくしょん!!
ふきだしけす |
その1 実際に電子回路を組む方のための資料: ※コンデンサは「積層セラミックコンデンサ 10uF 」です。 ※IchigoCake のピン出力は 3.3V です。 ※「10k」は「抵抗10kΩ」です。 ※IchigoCake BASIC 1.3.2 を使用。
|
その2 プログラムで、2進数の「10」をアドレス1に書き込みし、 2進数の「01」をアドレス2に書き込んでいます。 その後、アドレス1とアドレス2を読み込んで結果を LED の点滅の回数で知らせています。
実際に電子回路を組む方のための資料: ※コンデンサは「積層セラミックコンデンサ 10uF 」です。 ※PIC24H のピン出力は 3V です。 ※「10k」は「抵抗10kΩ」です。 ※MPLAB X IDE にて C30 C言語コンパイラを使用(※C30 は無償ですが IDE に最初から入っていません) ※実体配線図のとおりにした場合、電源は PICkit3 から供給するように MPLAB-IDE のプロジェクトに設定をします。 MPLAB-IDE にて、File メニュー>Project Properties (そのプロジェクト名)>(表示される画面の)左のリストで PICkit 3 クリック>右の上部のプルダウンメニューで「Power」を選択>Power target circuit from PICkit3 にチェックを入れる。OK ボタンで画面を閉じる。 ※IchigoCake と違って文字表示ができないので、LED の点滅回数で結果を示しています。 ※実体配線図のとおりにした場合、LED のそばに LED を点灯させるだけのボタンがあります。リセットボタンと間違えないように気を付けてください。 ※プログラムの内容は、左の IchigoCake とまったく同一の動きになっています。 ただし、若干、異なる部分があります。(読み込みの入力実行の直前で、少し待つ必要がある。おそらく PIC24H の処理が速すぎて、コンデンサが出力を始める前に入力を終えてしまうため) |
以上、「2アドレス2ビットメモリー」でした。
次は「2アドレス8ビットメモリー」です。
パソコンに搭載されている「メモリー」とほぼ同じものになったと言って良いでしょう。
上記の「2アドレス2ビットメモリー」から左方向へ6ビット増やし、増やしたビットの分、プログラムも処理を増やしています。
なお、これ以降の回路の動きについては、すでに「1アドレス2ビットメモリー」や、「2アドレス1ビットメモリー」で、横1列や縦1列の動きを説明したし、さらに「2アドレス2ビットメモリー」で横2列、縦2列の2次元的な動きも説明してもう十分だと思うので、動きの説明はこれ以上はしないことにします。
▼「2アドレス8ビットメモリー」の写真 (マイコンは PIC24H を使用)
▼DRAM回路部 拡大 |
▼マイコン部 拡大 |
▼LED点滅ではなく、液晶表示にしたバージョン アドレス1に2進数 0000 1111(10進数で15)、 アドレス2に2進数 1111 0000(10進数で240)を書き込み、 それぞれ読み込んで、結果の10進数を液晶に表示したところ。 |
(※IchigoCake版はまた次回にします)
▼その模式図(実体配線図) ※以降で不具合の話をしていて、新しいバージョンを掲載しています。
この右上のうすい緑色のエリアは、1つ前の「2アドレス2ビットDRAMメモリー回路」にあたる部分です。
マイコンのC言語プログラムリスト(まだ清書していませんが…)(以降で不具合の話をしていて新しいバージョンがあります)
感想:
これまで試行錯誤を重ねてきたおかげでわりとあっさりと動作してくれました。
最初のころはごく小さな容量のコンデンサを使っていたので、動いたり動かなくなったりと大変でした。
ところで、最近は月刊誌(トランジスタ技術2020年5月号)でも CPU の自作が特集されていたりして、もはやメーカーではない一般人が CPU も DRAM も自作できる時代になったようですね。
不具合発生:
電子回路がわかる人向けの話になりますが、あとになって上の回路で問題があることに気づきました。
「マイコンにプログラムを書き込んだ直後」はこのメモリーは正常に動作するけど、「リセットボタンを押してマイコンを再起動した場合」はアドレス2の読み出しの値がプログラムどおりに動けば「240」となるはずが「0」と表示される…
プログラムを変更して、処理するビット数を8ビットから4ビットに減らすと正常に動作します。
調べてみると、全ビット数が8~5ビットだと動作がおかしい、4~1ビットだと正常動作する、という結果になりました。
|
|
マイコンが出力できる電流は無尽蔵ではなく、たとえば家庭の電気をたくさん使うとブレーカーが落ちるように、マイコンもピンにたくさん何かをつなぐと電流が足らなくなり回路がうまく動作しなくなる…ということが起こります。(ICのそういう制限のことを「ファンアウト」といいます)
PIC24Hのデータシート(DS70289J-page 199)の
「22.0 ELECTRICAL CHARACTERISTICS」という小題の、「Absolute Maximum Ratings(1)」の項目を見ると、
Maximum current sourced/sunk by any 2x I/O pin(3) ................................................................................................8 mA※sourced(source):ピンに流れてくる(入力)、sunk(sink):ピンから流れていく(出力)
このへんの電流の制限を、このDRAM回路は超えているってことかなぁ…?
これについて私が思い付く対策は以下のような感じです。
以上、3つとも試しましたが、うまくいったのは1番でした。2,3番は症状が同じで変わりませんでした。
そういうわけで解決に至ったのですが、「問題は本当にファンアウトなのか」というのと、仮にファンアウトだとして「なんでRBだけだったのを一部RAに振り分けることで解決となるのか」という疑問点がそのまま残っていて、力不足を感じました。
あと、「書き込み後」と「リセット後」とで動作結果が異なるって、どういうことなんでしょうね。
パソコンで言うと、電源入れたときと再起動とで Windows の調子が異なる、ということです。どっちも同じなんですがねぇ。。
パソコンから書き込みしたときは良いけど、基板のリセットボタンを押したときは、基板がこう言っているんですよ。
「あっ、さわってんじゃねぇよお」 |
いろいろ調べていてわかってきたことなんですが、
読み書きそれぞれポイントが見えてきました。
しかしそれら2点には
が関わっているので、この2点の時間決めは手探りになってしまいます。
コンデンサの電気的な特性とか、マイコンの細かいしくみとか、知っていれば、そういう手探りもしなくていいのかもしれません。
▼不具合対応した後の模式図(実体配線図)
模式図とプログラムリストは、 です。
以上不具合の対処のお話でした。
このあとは、
…などの記事を書いて、いくつか不備のある記事を手直しし、全体を章立てして読みやすくまとめて、それで完結にする予定です。
終わるのいつだろう…
※また後日更新予定です。
写真のメモリは、全2番地、各番地8ビットという、とても低容量なメモリです。全2バイトあるので「2バイトメモリー」と命名しましょう。
たとえば、1GBのメモリをこの調子で作るとしたら…
1GB = 1,000MB = 1,000,000(百万)KB = 1,000,000,000(10億)byte = 8,000,000,000(80億)bit だから、
80億個のトランジスタとコンデンサを写真のように組まなきゃなりません。
80億?! うぇ~っ!
|
80億!! ゥハァー!
|
うぇ~ハァー( ウェハー )を使えば80億くらい一瞬ね…
|
おまけコーナー:
FILE | DOWNLOAD | |
---|---|---|
こういう顔イラストが数点入っています。 Excel 版は Office の図形なので、編集できます。 PDF 版は編集はできませんが、閲覧したり拡大したりできます。 私はイラストは素人でなおかつ手抜きをしていますが、多少、価値があると思うので著作権フリーで公開します。 |
2020/2/16 Excel 版 1.5 MB DOWNLOAD PDF 版 636 kB DOWNLOAD |
|
HISTORY | ||
更新 2020/2/16 8点追加 合計25点 ************************ 更新 2019/11/2 4点追加 合計17点 ************************ 公開 2019/10/14 13点 |
(訪問者のどんなニーズと この記事がつながるか)
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数
console.log( "文字列" );
}
function Class1() {
//クラス
console.log( "文字列" );
}
Class1.prototype.method1 = function() {
//メソッド
console.log( "文字列" );
}
</script>
</head>
<body onload="onloadx();" style="">
Hello world!<BR>
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数
console.log( "文字列" );
}
function Class1() {
//クラス
console.log( "文字列" );
}
Class1.prototype.method1 = function() {
//メソッド
console.log( "文字列" );
}
</script>
</head>
<body onload="onloadx();" style="">
Hello world!<BR>
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数 コメント変更
console.log( "文字列変更" );
行追加
}
function Class1() {
//クラス コメント変更
console.log( "文字列変更" );
行追加
}
Class1.prototype.method1 = function() {
//メソッド コメント変更
console.log( "文字列変更" );
行追加
}
</script>
</head>
<body onload="onloadx();文字列変更" style="">
Hello world!<BR>
HTML追加
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数 コメント変更
console.log( "文字列変更" );
行追加
}
function Class1() {
//クラス コメント変更
console.log( "文字列変更" );
行追加
}
Class1.prototype.method1 = function() {
//メソッド コメント変更
console.log( "文字列変更" );
行追加
}
</script>
</head>
<body onload="onloadx();文字列変更" style="">
Hello world!<BR>
HTML追加
</body>
</html>